package http;

/*--------------------------------------------------
 GetNpost.java

 Use GET or POST to communicate with a Java servlet. 
 The servlet will search a database for the balance
 of an account.

 Example from the book:     Core J2ME Technology
 Copyright John W. Muchow   http://www.CoreJ2ME.com 
 You may use/modify for any non-commercial purpose
-------------------------------------------------*/
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.io.*;
import java.io.*;
import obj.MonHoc;


public class HTTPDemo extends MIDlet implements CommandListener
{
  private Display display;      // Reference to Display object
  private Form fmMain;         // The main form
  private Alert alError;       // Alert to error message
  private Command cmGET;       // Request method GET
  private Command cmPOST;      // Request method Post
  private Command cmJSON;      // 

  private Command cmExit;      // Command to exit the MIDlet
  private TextField tfAcct;    // Get account number
  private TextField tfPwd;     // Get password
  private StringItem siBalance;// Show account balance
  private StringItem sStatus;// 
  private String errorMsg = null;

  Alert tb = new Alert("Thong bao", "Mac dinh",null,null);

public HTTPDemo()
  {
    display = Display.getDisplay(this);


// Create commands
cmGET = new Command("GET", Command.SCREEN, 2);
cmPOST = new Command("POST", Command.SCREEN, 3);
cmJSON = new Command("JSON", Command.SCREEN, 4); 
cmExit = new Command("Exit", Command.EXIT, 1);

// Textfields
tfAcct = new TextField("Account:", "", 5, TextField.NUMERIC);
tfPwd = new TextField("Password:", "", 10, TextField.ANY | TextField.PASSWORD);

// Balance string item
siBalance = new StringItem("Balance: $", "");
sStatus = new StringItem("Json is: ", "");

// Create Form, add commands &amp; componenets, listen for events
fmMain = new Form("Account Information");    
fmMain.addCommand(cmExit);
fmMain.addCommand(cmGET);
fmMain.addCommand(cmPOST);
fmMain.addCommand(cmJSON);

fmMain.append(tfAcct);
fmMain.append(tfPwd);
fmMain.append(siBalance);

fmMain.setCommandListener(this);

}


public void startApp()
  {
    display.setCurrent(fmMain);
  }


public void pauseApp()
  { }


public void destroyApp(boolean unconditional)
  { }


public void commandAction(Command c, Displayable s)
  {
    if (c == cmGET || c == cmPOST || c == cmJSON)
    {
      try 
      {
        if (c == cmGET)
          lookupBalance_withGET(); 
        else
            if(c == cmPOST)
                lookupBalance_withPOST();
        else
                jsonDemo();
      }
      catch (Exception e)
      { 
        System.err.println("Msg: " + e.toString());
      }
    }
    else if (c == cmExit)
    {
      destroyApp(false);
      notifyDestroyed();
    } 
  }


/*--------------------------------------------------
  * Access servlet using GET
  -------------------------------------------------*/  

  private void lookupBalance_withGET() throws IOException
  {
    HttpConnection http = null;
    InputStream iStrm = null;  

    boolean ret = false;


// Data is passed at the end of url for GET
String url = "http://localhost:51486/Demo/Blance.aspx"  + "?" +
             "uid=" + tfAcct.getString() + "&" + 
             "pwd=" + tfPwd.getString();

try
{
  http = (HttpConnection) Connector.open(url);

  //----------------
  // Client Request
  //----------------
  // 1) Send request method
  http.setRequestMethod(HttpConnection.GET);
  // 2) Send header information - none
  // 3) Send body/data -  data is at the end of URL

  //----------------
  // Server Response
  //----------------
  iStrm = http.openInputStream();      
  // Three steps are processed in this method call
  ret = processServerResponse(http, iStrm);
}
finally
{
  // Clean up
  if (iStrm != null)
    iStrm.close();
  if (http != null)
    http.close();
}

// Process request failed, show alert    
if (ret == false)
  showAlert(errorMsg);

}


/*--------------------------------------------------
  * Access servlet using POST
  -------------------------------------------------*/

  private void lookupBalance_withPOST() throws IOException
  {

    HttpConnection http = null;
    OutputStream oStrm = null;
    InputStream iStrm = null;  

    boolean ret = false;


// Data is passed as a separate stream for POST (below)
String url = "http://localhost:51486/Demo/Blance.aspx"; 

try
{
  http = (HttpConnection) Connector.open(url);
  oStrm = http.openOutputStream();

  //----------------
  // Client Request
  //----------------
  // 1) Send request type
  http.setRequestMethod(HttpConnection.POST);

  // 2) Send header information. Required for POST to work!
  http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

  // If you experience connection/IO problems, try 
  // removing the comment from the following line
  //   http.setRequestProperty("Connection", "close");

  // 3) Send data/body
  // Write account number
  byte data[] = ("account=" + tfAcct.getString()).getBytes();
  oStrm.write(data);

  // Write password
  data = ("&amp;password=" + tfPwd.getString()).getBytes();
  oStrm.write(data);

  // For 1.0.3 remove flush command
  // See the note at the bottom of this file

//      oStrm.flush();


  //----------------
  // Server Response
  //----------------
  iStrm = http.openInputStream();      
  // Three steps are processed in this method call      
  ret = processServerResponse(http, iStrm);
}
finally
{
  // Clean up
  if (iStrm != null)
    iStrm.close();
  if (oStrm != null)
    oStrm.close();        
  if (http != null)
    http.close();
}

// Process request failed, show alert    
if (ret == false)
  showAlert(errorMsg);

}


/*--------------------------------------------------
  * Process a response from a server
  -------------------------------------------------*/
  private boolean processServerResponse(HttpConnection http, InputStream iStrm) throws IOException
  {
    //Reset error message
    errorMsg = null;


// 1) Get status Line
if (http.getResponseCode() == HttpConnection.HTTP_OK)
{
  // 2) Get header information - none

  // 3) Get body (data)
  int length = (int) http.getLength();
  String str;
  if (length != -1)
  {
    byte servletData[] = new byte[length];
    iStrm.read(servletData);
    str = new String(servletData);
  }
  else  // Length not available...
  {
    ByteArrayOutputStream bStrm = new ByteArrayOutputStream();

    int ch;
    while ((ch = iStrm.read()) != -1)
      bStrm.write(ch);

    str = new String(bStrm.toByteArray());
    bStrm.close();
  }

 // Update the string item on the display
 siBalance.setText(str);
 return true;

}
else
  // Use message from the servlet
  errorMsg = new String( http.getResponseMessage());

return false;

}


/*--------------------------------------------------
  * Show an Alert
  -------------------------------------------------*/
  private void showAlert(String msg)
  {
    // Create Alert, use message returned from servlet
    alError = new Alert("Error", msg, null, AlertType.ERROR);


// Set Alert to type Modal
alError.setTimeout(Alert.FOREVER);

// Display the Alert. Once dismissed, display the form
display.setCurrent(alError, fmMain);

}

    private void jsonDemo() {
        //Converting Object to JSON
        MonHoc m = new MonHoc(1, "Java", 4);
        tb.setString(m.toJSON());
        Display.getDisplay(this).setCurrent(tb); 
        //sStatus.setText("Convert to JSON: " + m.toJSON());
//        System.out.println("Convert to JSON : "+m.toJSON());

        //Converting JSON to Object
//        String sample = "{\"id\":2,\"ten\":\"Algorithm\",\"soHocTrinh\":\"4\"}";
//        MonHoc m2 = new MonHoc();
//        m2.fromJSON(sample);
//        sStatus.setText(m2.toString());
//        System.out.println("Convert from JSON : "+m2);
    }
    
    

/*
 * liemqv-17/11/2011
 */
    
    /*--------------------------------------------------
  * Access servlet using POST
  -------------------------------------------------*/

  private void json_withPOST() throws IOException
  {

    HttpConnection http = null;
    OutputStream oStrm = null;
    InputStream iStrm = null;  

    boolean ret = false;


// Data is passed as a separate stream for POST (below)
String url = "http://localhost:51486/json/DemoJsonDotNet.aspx"; 

try
{
  http = (HttpConnection) Connector.open(url);
  oStrm = http.openOutputStream();

  http.setRequestMethod(HttpConnection.POST);
  http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
  byte data[] = ("account=" + tfAcct.getString()).getBytes();
  oStrm.write(data);

  // Write password
  data = ("&amp;password=" + tfPwd.getString()).getBytes();
  oStrm.write(data);

  // For 1.0.3 remove flush command
  // See the note at the bottom of this file

//      oStrm.flush();


  //----------------
  // Server Response
  //----------------
  iStrm = http.openInputStream();      
  // Three steps are processed in this method call      
  ret = processServerResponse(http, iStrm);
}
finally
{
  // Clean up
  if (iStrm != null)
    iStrm.close();
  if (oStrm != null)
    oStrm.close();        
  if (http != null)
    http.close();
}

// Process request failed, show alert    
if (ret == false)
  showAlert(errorMsg);

}
    
}


